package com.practice.niuke.new_direct_basics.class07;

import java.util.Arrays;
import java.util.Comparator;

/**
 * 题目：一些项目要占用一个会议室宣讲， 会议室不能同时容纳两个项目的宣讲。
 * 给你每一个项目开始的时间和结束的时间(给你一个数 组， 里面是一个个具体
 * 的项目)， 你来安排宣讲的日程， 要求会议室进行的宣讲的场次最多。
 * 返回这个最多的宣讲场次。
 *
 * 解法：
 * 贪心策略：以会议的 结束时间早 的策略 选择会议
 */
public class Code04_BestArrange {

    /**
     * 项目宣讲会议 类
     */
    public static class Program {
        // 会议开始时间
        public int start;
        // 会议结束时间
        public int end;

        public Program(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }

    /**
     * 比较器：
     * 以会议的结束时间进行比较，结束时间小的排在前面
     */
    public static class ProgramComparator implements Comparator<Program> {

        @Override
        public int compare(Program o1, Program o2) {
            return o1.end - o2.end;
        }

    }

    /**
     * 最优会议安排
     *
     * @param programs 所有会议组成的数组
     * @param timePoint （所有安排的会议结束后）此时来到的时间点
     * @return 安排的会议的个数
     */
    public static int bestArrange(Program[] programs, int timePoint) {
        // 对会议按照结束时间进行排序
        Arrays.sort(programs, new ProgramComparator());
        int result = 0;
        // 从左往右依次遍历所有的会议
        for (int i = 0; i < programs.length; i++) {
            // （所有安排的会议结束后）此时来到的时间点 足不足够 开始 i 号会议
            if (timePoint <= programs[i].start) {
                result++;
                // （所有安排的会议结束后）此时来到的时间点
                timePoint = programs[i].end;
            }
        }
        return result;
    }

    public static void main(String[] args) {

    }

}
